From 55aa438831b82695a5cce6d505592b421096629a Mon Sep 17 00:00:00 2001 From: scribblemaniac Date: Wed, 15 Jul 2015 22:47:51 -0600 Subject: Improved spider AI Fixes #2335 --- src/Mobs/Spider.cpp | 42 +++++++++++++++++++++++++++++++++++++++++- src/Mobs/Spider.h | 2 ++ src/World.h | 1 + 3 files changed, 44 insertions(+), 1 deletion(-) diff --git a/src/Mobs/Spider.cpp b/src/Mobs/Spider.cpp index 184a1d912..a9da28750 100644 --- a/src/Mobs/Spider.cpp +++ b/src/Mobs/Spider.cpp @@ -3,7 +3,8 @@ #include "Spider.h" - +#include "../World.h" +#include "../Entities/Player.h" @@ -33,3 +34,42 @@ void cSpider::GetDrops(cItems & a_Drops, cEntity * a_Killer) + +void cSpider::EventSeePlayer(cEntity * a_Entity) +{ + if (!GetWorld()->IsChunkLighted(GetChunkX(), GetChunkZ())) + { + GetWorld()->QueueLightChunk(GetChunkX(), GetChunkZ()); + return; + } + + if (!static_cast(a_Entity)->IsGameModeCreative() && (GetWorld()->GetBlockBlockLight(this->GetPosition()) <= 9)) + { + super::EventSeePlayer(a_Entity); + } +} + + + + + +bool cSpider::DoTakeDamage(TakeDamageInfo & a_TDI) +{ + if (!super::DoTakeDamage(a_TDI)) + { + return false; + } + + // If the source of the damage is not from an pawn entity, switch to idle + if ((a_TDI.Attacker == nullptr) || !a_TDI.Attacker->IsPawn()) + { + m_EMState = IDLE; + } + else + { + // If the source of the damage is from a pawn entity, chase that entity + m_EMState = CHASING; + } + + return true; +} diff --git a/src/Mobs/Spider.h b/src/Mobs/Spider.h index 24134c00f..4f9df7887 100644 --- a/src/Mobs/Spider.h +++ b/src/Mobs/Spider.h @@ -18,6 +18,8 @@ public: CLASS_PROTODEF(cSpider) virtual void GetDrops(cItems & a_Drops, cEntity * a_Killer = nullptr) override; + virtual void EventSeePlayer(cEntity *) override; + virtual bool DoTakeDamage(TakeDamageInfo & a_TDI) override; } ; diff --git a/src/World.h b/src/World.h index aeab7bfa5..083f3f204 100644 --- a/src/World.h +++ b/src/World.h @@ -484,6 +484,7 @@ public: BLOCKTYPE GetBlock (const Vector3i & a_Pos) { return GetBlock( a_Pos.x, a_Pos.y, a_Pos.z); } NIBBLETYPE GetBlockMeta(const Vector3i & a_Pos) { return GetBlockMeta( a_Pos.x, a_Pos.y, a_Pos.z); } void SetBlockMeta(const Vector3i & a_Pos, NIBBLETYPE a_MetaData) { SetBlockMeta( a_Pos.x, a_Pos.y, a_Pos.z, a_MetaData); } + NIBBLETYPE GetBlockBlockLight(const Vector3i & a_Pos) { return GetBlockBlockLight( a_Pos.x, a_Pos.y, a_Pos.z); } // tolua_end /** Writes the block area into the specified coords. -- cgit v1.2.3